/**
 * https://www.bilibili.com/video/BV1Mb411e7re?p=19
 * Serial Communication 串口通信
 * 
 * 串口介绍
 * 1.串口是一种应用十分广泛的通讯接口，串口成本低、容易使用、通信线路简单，可实现两个设备的互相通信。
 * 2.单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信，极大的扩展了单片机的应用范围，增强了单片机系统的硬件实力。
 * 3.51单片机内部自带 UART （Universal Asynchronous Receiver Transmitter，通用异步收发器），可实现单片机的串口通信。
 * 
 * 使用串口通信: 
 *   打开 stc-isp 烧录软件 --> USB-CDC/串口助手 --> 勾选'HEX模式',选择串口,波特率,校验 --> 打开串口
 *   还有其它的串口助手, 网上搜
 *   也可以自己用上位机编写自己的串口程序.
 */
#include <REGX52.H>
#include <STRING.H>
#include "Link/Delay_Utils.h"
#include "Link/LCD1602_Utils.h"
#include "Link/UART_Utils.h"

static void UART_onTick(unsigned char ch);

void main_uart() {
    //初始化液晶
    LCD1602_Init(1);
    LCD_ShowString(1, 1, "Received Data:");

    //初始化串口, 设置是否接收数据&波特率
    UART_Init(1, 4800);
    UART_setOnTickListener(&UART_onTick);
    
    //如果是12MHz有误差, 波特率对不上, 那么发射的时候延迟一下就正确了
    UART_sendString("printf(\"123456\");", 1);
    //汉字发送失败
    UART_sendString("发送数据", 1);
    UART_sendStringFormat(1, "a=%bd, b=%c", 123, 'A');
    
    UART_sendByte(0x66);    //f
    while (1);
}

/**
 * ch就是接收到的数据
 * 在电脑端发送: f0 => P1=11110000(低4位灯亮)
 *              aa => P1=10101010(间隔亮)
 */
static void UART_onTick(unsigned char ch) {
    LCD_ShowHexNum(2, 1, ch, 4);
    //又发送给电脑
    UART_sendByte(ch);
    P1 = ch;
}